home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / t_os / ami_sys / ovl_src / filter0.c next >
C/C++ Source or Header  |  1993-11-30  |  4KB  |  130 lines

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <DOS.h>        /* _FP_SEG(), _FP_OFF()   */
  4. #include <egb.h>
  5. #include <msdos.cf>
  6. #include <loader.h>              /* pcl_exit() を使うため            */
  7.                                  /* 拡張ライブラリ1 があった方がよい */
  8.                          /* 元に戻れるようにディレクトリは移動しない */
  9. #define GETVRAM(buf, x1,y1,x2,y2) \
  10.         {    struct {char *bp; short sel; short sx,sy,ex,ey;} p;  \
  11.           p.bp=(char *)buf; p.sel=getds(); \
  12.           p.sx=x1;p.sy=y1;p.ex=x2;p.ey=y2; \
  13.           EGB_writePage(gwork,0);                                  \
  14.           EGB_getBlock( gwork, (char *)&p ); }
  15.  
  16. #define PUTVRAM(buf, x1,y1,x2,y2) \
  17.         {    struct {char *bp; short sel; short sx,sy,ex,ey;} p;  \
  18.           p.bp=(char *)buf; p.sel=getds() ; \
  19.           p.sx=x1;p.sy=y1;p.ex=x2;p.ey=y2; \
  20.           EGB_writePage( gwork,0); \
  21.           EGB_putBlock( gwork, 0, (char *)&p ); }
  22.  
  23. #define LINE(x1,y1,x2,y2,c,m) \
  24.     { struct { short n,sz,sy,ex,ey;} p;           \
  25.         p.n=2;p.sz=x1; p.sy=y1; p.ex=x2; p.ey=y2; \
  26.         EGB_writePage(gwork,1);                   \
  27.         EGB_color(gwork,0,c);                     \
  28.         EGB_writeMode(gwork,m);                   \
  29.         EGB_connect(gwork,(char*)&p);        }
  30.  
  31.  
  32. char           *gwork;             /* EGB用 ワーク領域           */
  33. unsigned short (*awork)[320];      /* VRAMの複写領域             */
  34.  
  35. void screen_get() 
  36. {
  37.     /* 最初は EGB_init を使わないで画面設定します                  */
  38.     memset( gwork, 0, EgbWorkSize );     /* 念のため0クリア        */
  39.     EGB_displayPage(gwork,0,0);          /* 意味ないかもしれない   */
  40.     EGB_resolution(gwork,0,10);          /* page=0; 32Kmode        */
  41.     EGB_resolution(gwork,1, 3);          /* page=1; 16mode         */
  42.     GETVRAM(&awork[0][0],0,0,319,239);    /* VRAMをワーク領域に複写 */
  43.     return ;
  44. }
  45. void screen_set()
  46. {
  47.     /* 改めて正式に初期化します */
  48.     EGB_init(gwork,EgbWorkSize);
  49.     EGB_resolution(gwork,0,10);          /* page=0; 32Kmode          */
  50.     EGB_resolution(gwork,1, 3);          /* page=1;  16mode          */
  51.     EGB_writePage(gwork,0);              /* page0 設定               */
  52.     EGB_displayStart(gwork,3,0,0);
  53.     EGB_displayStart(gwork,2,2,2);
  54.     EGB_displayStart(gwork,0,0,0);
  55.     EGB_displayStart(gwork,1,0,0);
  56.     EGB_displayStart(gwork,3,320,240);
  57.     EGB_writePage(gwork,1);              /* page1 設定       */
  58.     EGB_displayStart(gwork,3,0,0);
  59.     EGB_displayStart(gwork,2,1,1);
  60.     EGB_displayStart(gwork,0,0,0);
  61.     EGB_displayStart(gwork,1,0,0);
  62.     EGB_displayStart(gwork,3,640,480);
  63.     return ;
  64. }
  65.  
  66. void main(void)
  67. {
  68.  
  69.     awork=malloc( 240*320* sizeof(short) );
  70.     if(awork==NULL) return ;
  71.     gwork=malloc( EgbWorkSize*sizeof(char) );
  72.     if(gwork==NULL) return ;
  73.     screen_get();
  74.     screen_set();
  75.     EGB_displayPage(gwork,1,3);          /* page1 前 */
  76.     EGB_writePage(gwork,0);
  77.     PUTVRAM( &awork[0][0], 0,0,319,239); /* 画面復帰 */
  78.     sub();
  79.     pcl_exit(0);
  80.     return ;
  81. }
  82.  
  83. sub()
  84. {   
  85.     int level=16;
  86.     flat(level);
  87.     return 0;
  88. }
  89.  
  90. int flat(int level)
  91. {
  92.   _far unsigned short *vram1;
  93.   int  i,j;
  94. #define COLSP(x,g,r,b) { b=x & 0x001f; r=(x & 0x03e0)>>5; g=x>>10;}
  95. #define COLCN(x,g,r,b) { x = b | (r<<5) | (g<<10); }
  96. #define COLDF(g1,r1,b1,g2,r2,b2) ( _abs((g2)-(g1))+_abs((r2)-(r1))+_abs((b2)-(b1)))
  97.  
  98.   _FP_SEG( vram1 ) = 0x104;     /* 又は 0x10c  */
  99.   _FP_OFF( vram1 ) = 0;
  100.  
  101.   for( j=1; j<239; j++)
  102.   {
  103.   for( i=1; i<319; i++)
  104.     {
  105.     int k,n,av,ag,ar,ab, g[9],r[9],b[9];
  106.     av=awork[j][i]; COLSP( av, ag, ar, ab);
  107.     av=awork[j-1][i-1]; COLSP( av, g[0], r[0], b[0]);  
  108.     av=awork[j-1][i  ]; COLSP( av, g[1], r[1], b[1]);  
  109.     av=awork[j-1][i+1]; COLSP( av, g[2], r[2], b[2]);  
  110.     av=awork[j  ][i-1]; COLSP( av, g[3], r[3], b[3]);  
  111.     av=awork[j  ][i  ]; COLSP( av, g[8], r[8], b[8]);  
  112.     av=awork[j  ][i+1]; COLSP( av, g[4], r[4], b[4]);  
  113.     av=awork[j+1][i-1]; COLSP( av, g[5], r[5], b[5]);  
  114.     av=awork[j+1][i  ]; COLSP( av, g[6], r[6], b[6]);  
  115.     av=awork[j+1][i+1]; COLSP( av, g[7], r[7], b[7]);  
  116.     for(n=1,k=0;k<8;k++)
  117.       {
  118.       if( COLDF( g[8],r[8],b[8],g[k],r[k],b[k] ) <= level ) 
  119.          {ag+=g[k];ar+=r[k];ab+=b[k];n++;}
  120.       }
  121.     ag/=n;ar/=n;ab/=n;
  122.     COLCN( av, ag, ar, ab);
  123.     /* awork[j][i]=vram1[j*512+i]=av ; */
  124.     vram1[j*512+i]=av ; 
  125.     }
  126.     LINE(632,j*2,639,j*2,4,4);
  127.   }
  128.   return 0;
  129. }
  130.